iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
2
自我挑戰組

卡牌連線遊戲開發經驗分享系列 第 18

#18 進入卡片的世界:談卡牌操作的實作細節

  • 分享至 

  • xImage
  •  

在我們開始進入連線傳輸資料、規則運算之前,我們是不是忘了很重要的主角?
是的,談到卡牌遊戲當然一定要講卡牌這個部份。

在我們小時候剛學程式,應該或多或少都有寫過撲克牌吧?

作法差不多有兩類:

  1. 數字id命名撲克牌
  2. 符號+數字命名,♠♥♦♣這些當時的大家應該有用過的符號,現在變成 Emoji更方便了

牌定義好之後,就創造一個陣列把所有的牌丟進去,洗牌、抽牌之類的操作。我想這一類的程式對於初學者來說並不陌生,難度並不高,所以我想針對比較細節的部份談。

通常在實作的時候,我們會用另外一個比陣列方便一點的結構:Stack(堆疊)
它的優點是在抽牌部份很方便,只要用 POP 就可以了,在牌庫使用 Stack 算是不二之選
但是實作手牌的時候,就會很杯具

如果你想要實作比較擬真的手牌操作,像是把牌抽出,插到另外一個位置,就要稍微思考一下怎麼處理了。一般電腦內的陣列都是固定位置的,所以要讓手牌可以任意調整位置,你需要創造一個可以動態抽出和插入的結構。我目前迴避掉這個問題,但我希望未來的卡牌遊戲可以實作這項功能。這在一般網頁好像已經有類似操作了(任意搬移項目),所以應該是可以解決的問題

以我自己實作的部份來說,我針對卡牌操作的部份定義了四個類別:Card, Cards, HandCards, Deck

Card 就是最基本的卡片沒話說,大致是用 符號+數字命名卡牌,沒有用 id,這是因為有後面的考量。
Cards 是卡片堆,內部其實就是用陣列去裝卡片,可以抽牌,或是把別堆牌合成一疊
HandCards 是手牌堆,額外實作了兩個操作:選牌、出牌。這跟一般在打撲克牌要出牌的過程是一樣的。
Deck 是牌庫,跟卡牌堆一樣,不過複寫了抽牌。它會在牌庫抽乾的時候自動重新洗牌,很 Nice。

今天大概是簡單談,因為卡牌遊戲畢竟還是要有卡牌,所以從這開始談。
再來會談卡牌上面建構抽象的虛擬世界,我們明天見!


上一篇
#17 關於連線遊戲開發
下一篇
#18-2 番外篇:以組合為主的卡牌構築實作 - 大老二、麻將
系列文
卡牌連線遊戲開發經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言